home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / arpcmd.c < prev    next >
C/C++ Source or Header  |  1989-03-07  |  4KB  |  206 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "timer.h"
  5. #include "enet.h"
  6. #include "ax25.h"
  7. #include "arp.h"
  8. #include "cmdparse.h"
  9.  
  10. extern char badhost[];
  11. extern char nospace[];
  12.  
  13. int doarpadd(),doarpdrop();
  14. struct cmds arpcmds[] = {
  15.     "add", doarpadd, 4,
  16.     "arp add <hostid> ether|ax25|netrom <ether addr|callsign>",
  17.     "arp add failed",
  18.  
  19.     "drop", doarpdrop, 3,
  20.     "arp drop <hostid> ether|ax25|netrom",
  21.     "not in table",
  22.  
  23.     "publish", doarpadd, 4,
  24.     "arp publish <hostid> ether|ax25|netrom <ether addr|callsign>",
  25.     "arp add failed",
  26.  
  27.     NULLCHAR, NULLFP, 0,
  28.     "arp subcommands: add, drop, publish",
  29.     NULLCHAR, 
  30. };
  31. char *arptypes[] = {
  32.     "NET/ROM",
  33.     "10 Mb Ethernet",
  34.     "3 Mb Ethernet",
  35.     "AX.25",
  36.     "Pronet",
  37.     "Chaos",
  38. #ifdef MAC
  39.     "Empty",
  40. #endif
  41.     "Arcnet",
  42.     "Appletalk"
  43. };
  44.  
  45. int
  46. doarp(argc,argv)
  47. int argc;
  48. char *argv[];
  49. {
  50.     if(argc < 2){
  51.         dumparp();
  52.         return 0;
  53.     }
  54.     return subcmd(arpcmds,argc,argv);
  55. }
  56. static
  57. doarpadd(argc,argv)
  58. int argc;
  59. char *argv[];
  60. {
  61.     int16 hwalen,hardware,naddr;
  62.     int32 addr,resolve();
  63.     char *hwaddr;
  64.     struct arp_tab *ap;
  65.     struct arp_type *at;
  66.     void arp_drop();
  67.     int pub = 0;
  68.  
  69.     if(argv[0][0] == 'p')    /* Is this entry published? */
  70.         pub = 1;
  71.     if((addr = resolve(argv[1])) == 0){
  72.         printf(badhost,argv[1]);
  73.         return 1;
  74.     }
  75.     /* This is a kludge. It really ought to be table driven */
  76.     switch(tolower(argv[2][0])){
  77.     case 'n':    /* Net/Rom pseudo-type */
  78.         hardware = ARP_NETROM;
  79.         naddr = argc - 3 ;
  80.         if (naddr != 1) {
  81.             printf("No digipeaters in NET/ROM arp entries - ") ;
  82.             printf("use netrom route add\n") ;
  83.             return 1 ;
  84.         }
  85.         break;
  86.     case 'e':    /* "ether" */
  87.         hardware = ARP_ETHER;
  88.         naddr = 1;
  89.         break;        
  90.     case 'a':    /* "ax25" */
  91.         hardware = ARP_AX25;
  92.         naddr = argc - 3;
  93.         break;
  94.     case 'm':    /* "mac appletalk" */
  95.         hardware = ARP_APPLETALK;
  96.         naddr = 1;
  97.         break;
  98.     default:
  99.         printf("unknown hardware type \"%s\"\n",argv[2]);
  100.         return -1;
  101.     }
  102.     /* If an entry already exists, clear it */
  103.     if((ap = arp_lookup(hardware,addr)) != NULLARP)
  104.         arp_drop(ap);
  105.  
  106.     at = &arp_type[hardware];
  107.     if(at->scan == NULLFP){
  108.         printf("Attach device first\n");
  109.         return 1;
  110.     }
  111.     /* Allocate buffer for hardware address and fill with remaining args */
  112.     hwalen = at->hwalen * naddr;
  113.     if((hwaddr = malloc(hwalen)) == NULLCHAR){
  114.         printf(nospace);
  115.         return 0;
  116.     }
  117.     /* Destination address */
  118.     (*at->scan)(hwaddr,&argv[3],argc - 3);
  119.     ap = arp_add(addr,hardware,hwaddr,hwalen,pub);    /* Put in table */
  120.     free(hwaddr);                    /* Clean up */
  121.     stop_timer(&ap->timer);            /* Make entry permanent */
  122.     ap->timer.count = ap->timer.start = 0;
  123.     return 0;
  124. }
  125. /* Remove an ARP entry */
  126. static
  127. doarpdrop(argc,argv)
  128. int argc;
  129. char *argv[];
  130. {
  131.     int16 hardware;
  132.     int32 addr,resolve();
  133.     struct arp_tab *ap;
  134.     void arp_drop();
  135.  
  136.     if((addr = resolve(argv[1])) == 0){
  137.         printf(badhost,argv[1]);
  138.         return 1;
  139.     }
  140.     /* This is a kludge. It really ought to be table driven */
  141.     switch(tolower(argv[2][0])){
  142.     case 'n':
  143.         hardware = ARP_NETROM;
  144.         break;
  145.     case 'e':    /* "ether" */
  146.         hardware = ARP_ETHER;
  147.         break;        
  148.     case 'a':    /* "ax25" */
  149.         hardware = ARP_AX25;
  150.         break;
  151.     case 'm':    /* "mac appletalk" */
  152.         hardware = ARP_APPLETALK;
  153.         break;
  154.     default:
  155.         hardware = 0;
  156.         break;
  157.     }
  158.     if((ap = arp_lookup(hardware,addr)) == NULLARP)
  159.         return -1;
  160.     arp_drop(ap);
  161.     return 0;    
  162. }
  163. /* Dump ARP table */
  164. static
  165. dumparp()
  166. {
  167.     register int i;
  168.     extern struct arp_stat arp_stat;
  169.     register struct arp_tab *ap;
  170.     char e[128];
  171.     char *inet_ntoa();
  172.     extern char *arptypes[];
  173.  
  174.     printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  175.      arp_stat.recv,arp_stat.badtype,arp_stat.badaddr,arp_stat.inreq,
  176.      arp_stat.replies,arp_stat.outreq);
  177.  
  178.     printf("IP addr         Type           Time Q Addr\n");
  179.     for(i=0;i<ARPSIZE;i++){
  180.         for(ap = arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  181.             printf("%-16s",inet_ntoa(ap->ip_addr));
  182.             printf("%-15s",arptypes[ap->hardware]);
  183.             printf("%-5ld",ap->timer.count*(long)MSPTICK/1000);
  184.             if(ap->state == ARP_PENDING)
  185.                 printf("%-2u",len_q(ap->pending));
  186.             else
  187.                 printf("  ");
  188.             if(ap->state == ARP_VALID){
  189.                 if(arp_type[ap->hardware].format != NULLFP){
  190.                     (*arp_type[ap->hardware].format)(e,ap->hw_addr);
  191.                 } else {
  192.                     e[0] = '\0';
  193.                 }
  194.                 printf("%s",e);
  195.             } else {
  196.                 printf("[unknown]");
  197.             }
  198.             if(ap->pub)
  199.                 printf(" (published)");
  200.             printf("\n");
  201.         }
  202.     }
  203.     return 0;
  204. }
  205.  
  206.